#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>

// 命名管道路径 (与服务端一致)
#define FIFO_SERVER_PATH "/tmp/ai_glass_server"
#define FIFO_CLIENT_PATH "/tmp/ai_glass_client"
#define MAX_FIFO_MSG_LEN 512

// 发送命令到后台服务
int send_command_to_service(const char *cmd) {
    int server_fd, client_fd;
    char response[MAX_FIFO_MSG_LEN];
    ssize_t bytes_read;
    
    // 检查服务是否运行
    if (access(FIFO_SERVER_PATH, F_OK) != 0) {
        printf("错误: AI Glass后台服务未运行\n");
        printf("请先启动服务: ai_glass_test --daemon\n");
        return -1;
    }
    
    // 打开服务器管道发送命令
    server_fd = open(FIFO_SERVER_PATH, O_WRONLY | O_NONBLOCK);
    if (server_fd < 0) {
        printf("错误: 无法连接到后台服务: %s\n", strerror(errno));
        return -1;
    }
    
    // 发送命令
    ssize_t written = write(server_fd, cmd, strlen(cmd) + 1);
    if (written < 0) {
        printf("错误: 发送命令失败: %s\n", strerror(errno));
        close(server_fd);
        return -1;
    }
    
    close(server_fd);
    
    // 等待响应
    client_fd = open(FIFO_CLIENT_PATH, O_RDONLY);
    if (client_fd < 0) {
        printf("错误: 无法接收响应: %s\n", strerror(errno));
        return -1;
    }
    
    // 读取响应
    bytes_read = read(client_fd, response, sizeof(response) - 1);
    if (bytes_read > 0) {
        response[bytes_read] = '\0';
        printf("%s\n", response);
    } else {
        printf("错误: 接收响应失败\n");
        close(client_fd);
        return -1;
    }
    
    close(client_fd);
    return 0;
}

// 显示帮助信息
void show_help(const char *prog_name) {
    printf("AI Glass 命令行客户端\n\n");
    printf("用法: %s <AT命令>\n\n", prog_name);
    
    printf("支持的AT命令:\n");
    printf("  AT+AIGLASSPHOTO      - 拍照测试\n");
    printf("  AT+AIGLASSRECORD [n] - 录像测试 (n秒)\n");
    printf("  AT+AIGLASSRTSP       - RTSP流测试\n");
    printf("  AT+AIGLASSWIFI [ssid]- WiFi连接测试\n");
    printf("  AT+AIGLASSOTA        - OTA升级测试\n");
    printf("  AT+STATUS            - 查看系统状态\n");
    printf("  AT+HELP              - 显示帮助信息\n");
    printf("  AT+EXIT              - 停止后台服务\n");
    
    printf("\n示例:\n");
    printf("  %s AT+AIGLASSPHOTO             # 执行拍照测试\n", prog_name);
    printf("  %s \"AT+AIGLASSRECORD 10\"       # 执行10秒录像测试\n", prog_name);
    printf("  %s \"AT+AIGLASSWIFI MyWiFi\"     # 连接指定WiFi\n", prog_name);
    printf("  %s AT+STATUS                   # 查看服务状态\n", prog_name);
    printf("  %s AT+EXIT                     # 停止后台服务\n", prog_name);
    
    printf("\n注意:\n");
    printf("  - 命令不区分大小写\n");
    printf("  - 带空格的命令需要用引号包围\n");
    printf("  - 使用前请确保后台服务已启动\n");
}

// 检查服务状态
int check_service_status(void) {
    // 检查PID文件
    if (access("/tmp/ai_glass_daemon.pid", F_OK) != 0) {
        printf("✗ AI Glass后台服务未运行 (PID文件不存在)\n");
        printf("启动服务: ai_glass_test --daemon\n");
        return 1;
    }
    
    // 检查管道文件
    if (access(FIFO_SERVER_PATH, F_OK) != 0) {
        printf("✗ AI Glass后台服务未运行 (管道文件不存在)\n");
        printf("启动服务: ai_glass_test --daemon\n");
        return 1;
    }
    
    // 检查PID是否还在运行
    FILE *pid_file = fopen("/tmp/ai_glass_daemon.pid", "r");
    if (pid_file) {
        int pid;
        if (fscanf(pid_file, "%d", &pid) == 1) {
            fclose(pid_file);
            char proc_path[64];
            snprintf(proc_path, sizeof(proc_path), "/proc/%d", pid);
            if (access(proc_path, F_OK) == 0) {
                printf("✓ AI Glass后台服务正在运行 (PID: %d)\n", pid);
                return 0;
            } else {
                printf("✗ AI Glass后台服务未运行 (进程已停止)\n");
                printf("启动服务: ai_glass_test --daemon\n");
                return 1;
            }
        }
        fclose(pid_file);
    }
    
    printf("✗ AI Glass后台服务状态未知\n");
    printf("启动服务: ai_glass_test --daemon\n");
    return 1;
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("错误: 请提供AT命令\n");
        printf("使用 '%s --help' 查看帮助信息\n", argv[0]);
        return 1;
    }
    
    // 处理特殊参数
    if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) {
        show_help(argv[0]);
        return 0;
    }
    
    if (strcmp(argv[1], "--status") == 0) {
        return check_service_status();
    }
    
    if (strcmp(argv[1], "--version") == 0) {
        printf("AI Glass 命令行客户端 v1.0.0\n");
        return 0;
    }
    
    // 构建完整命令
    char full_command[MAX_FIFO_MSG_LEN] = "";
    for (int i = 1; i < argc; i++) {
        if (i > 1) strcat(full_command, " ");
        strcat(full_command, argv[i]);
    }
    
    // 发送命令到后台服务
    return send_command_to_service(full_command);
}